<?php
protectScript('Mysqli.php');

class AYSMysqli extends mysqli{
	public $fTotalExecutionTime = 0;
	public $iNumberQueries = 0;
	public $aiasmTraceQueries = null;
	private static $oMysqliInstance;
	public static $iIdInsert;

	public function __construct($sHost, $sLogin, $sPassword, $sDatabase){
		parent::__construct($sHost, $sLogin, $sPassword, $sDatabase);

		if(mysqli_connect_errno()){
			throw new MysqliConnexionException(
				'Une erreur a été rencontrée lors de l\'intéraction avec la base de données. L\'administrateur a été averti.',
				CRIT,
				array(
					'Infos' => 'Server Error n&deg;'.$this->errno.' : '.$this->error
				)
			);
		}
	}

	public static function getInstance(){
		if(!isset(self::$oMysqliInstance)){
			self::$oMysqliInstance = new AYSMysqli(BDD_HOST, BDD_USER, BDD_PASS, BDD_DATABASE);
		}
		return self::$oMysqliInstance;
	}

	public function query($sQuery){
		$this->aiasmTraceQueries[$this->iNumberQueries]['sQuery'] = $sQuery;

		$fTimeAtExecution = microtime(true);

		$rQueryResult = parent::query($sQuery);

		if(!$rQueryResult){
			throw new MysqliExecutionException(
				'Une erreur a été rencontrée lors de l\'intéraction avec la base de données. L\'administrateur a été averti.',
				ERROR,
				array(
					'Infos' => 'Server Error n°'.$this->errno.';Error: '.$this->error.';Data: '.$sQuery
				)
			);
		}

		self::$iIdInsert = $this->insert_id;

		$fTimeOfExecution = microtime(true) - $fTimeAtExecution;

		$this->fTotalExecutionTime += $fTimeOfExecution;

		$this->aiasmTraceQueries[$this->iNumberQueries]['fTimeOfExecution'] = $fTimeOfExecution;

		$this->iNumberQueries++;

		return $rQueryResult;
	}
}